package com.xzmzhp.controller.people;

import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageHelper;
import com.xzmzhp.constant.ReturnConstant;
import com.xzmzhp.pojo.people.Personnel;
import com.xzmzhp.service.people.PersonnelService;
import com.xzmzhp.utils.DateUtil;
import com.xzmzhp.utils.StringUtils;
import com.xzmzhp.utils.excel.DownloadTemplate;
import com.xzmzhp.dao.excel.ExcelMapper;
import com.xzmzhp.utils.return_tool.ReturnData;
import com.xzmzhp.utils.excel.UploadDataListener;
import com.xzmzhp.vo.personnel.PersonnelVo;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 王源(xm)
 * @Date: 2020/11/19 21:28
 * @Description: 人员信息前台交互页面
 */
@Controller
@CrossOrigin(origins = "*", maxAge = 3600)
@RequestMapping("/personnel")
public class PersonnelController {

    @Autowired
    private PersonnelService personnelService;

    /**
     * 查询所有人员信息
     *
     * @param page  起始个数
     * @param limit 查询个数
     * @return 是否成功
     */
    @GetMapping("/findAll")
    @ResponseBody
    public ReturnData findAll(@RequestParam(value = "page", defaultValue = "1") int page,
                              @RequestParam(value = "limit", defaultValue = "10") int limit) {
        PageHelper.startPage(page, limit, true);
        return personnelService.findAll();
    }

    /**
     * 根据人员id查询人员名称
     *
     * @param personnelId 人员id
     * @return returnData.toString()
     */
    @GetMapping("/findByPersonnelId/{personnelId}")
    @ResponseBody
    public ReturnData findByPersonnelId(@PathVariable int personnelId) {
        return personnelService.findByPersonnelId(personnelId);
    }

    /**
     * 根据人员id查询人员信息
     *
     * @param personnelId 人员id数组
     * @return PersonnelVo
     */
    @GetMapping("/findByPersonnelIds")
    @ResponseBody
    public ReturnData findByPersonnelIds(@RequestParam(value = "page", defaultValue = "1") int page,
                                        @RequestParam(value = "limit", defaultValue = "10") int limit,
                                        @RequestParam(value ="personnelId") String personnelId) {
        PageHelper.startPage(page, limit, true);
        return personnelService.findByPersonnelId(StringUtils.convert(personnelId));
    }

    /**
     * 根据学号模糊查询人员信息
     *
     * @param studentId 学号
     * @return returnData
     */
    @GetMapping("/findByStudentId/{studentId}")
    @ResponseBody
    public ReturnData findByStudentId(@PathVariable String studentId) {
        return personnelService.findByStudentId(studentId);
    }

    /**
     * 根据人员姓名、权限id、部门id、年级其中的一个或多个查询人员数据
     *
     * @param personnelName  人员姓名
     * @param competenceName 权限名称
     * @param positionName   部门名称
     * @param personnelGrade 年级
     * @param page           起始个数
     * @param limit          查询个数
     * @return ReturnData
     */
    @PostMapping("/findPersonnel")
    @ResponseBody
    public ReturnData findPersonnel(@RequestParam(value ="personnelName", defaultValue ="") String personnelName,
                                    @RequestParam(value ="competenceName",defaultValue="") String competenceName,
                                    @RequestParam(value ="positionName",defaultValue="") String positionName,
                                    @RequestParam(value ="personnelGrade",defaultValue="0") int personnelGrade,
                                    @RequestParam(value = "page", defaultValue = "1") int page,
                                    @RequestParam(value = "limit", defaultValue = "10") int limit) {
        PageHelper.startPage(page, limit);
        return personnelService.findPersonnel(personnelName, competenceName, positionName, personnelGrade);
    }

    /**
     * 根据权限id、部门id、年级其中的一个或多个查询人员数据
     *
     * @param competenceId   权限id
     * @param positionId     部门id
     * @param personnelGrade 年级
     * @param personnelId    人员id
     * @return ReturnData
     */
    @PostMapping("/checkPersonnel")
    @ResponseBody
    public ReturnData findPersonnel(@RequestParam(value ="competenceId",defaultValue="0") int competenceId,
                                    @RequestParam(value ="positionId",defaultValue="0") int positionId,
                                    @RequestParam(value ="personnelGrade",defaultValue="0") int personnelGrade,
                                    @RequestParam(value ="personnelId",defaultValue="0") int personnelId) {
        return personnelService.checkPersonnel(competenceId, positionId, personnelGrade, personnelId);
    }

    /**
     * 根据id查询活动名称
     *
     * @param personnelId 人员id
     * @return ReturnData
     */
    @GetMapping("/findActivityNames/{personnelId}")
    @ResponseBody
    public ReturnData findActivityNames(@PathVariable int personnelId) {
        return personnelService.findActivityNames(personnelId);
    }

    /**
     * 添加人员信息
     *
     * @param personnel 人员信息实体类
     * @return ReturnData
     */
    @PostMapping("/addPersonnel")
    @ResponseBody
    public ReturnData addPersonnel(@RequestBody Personnel personnel) {
        return personnelService.addPersonnel(personnel);
    }

    /**
     * 文件上传
     * <p>
     * 1. 创建excel对应的实体对象
     * <p>
     * 2. 由于默认一行行的读取excel，所以需要创建excel一行一行的回调监听
     * <p>
     * 3. 直接读即可
     */
    @PostMapping("uploadPersonnel")
    @ResponseBody
    public ReturnData uploadPersonnel(MultipartFile file) throws IOException {
        EasyExcel.read(file.getInputStream(), PersonnelVo.class, new UploadDataListener((ExcelMapper) personnelService)).sheet().doRead();
        return ReturnData.ok();
    }

    /**
     * 下载Excel模板
     */
    @ApiOperation(value = "下载模板", notes = "下载模板")
    @GetMapping("/downloadTemplate")
    public void downloadTemplate(HttpServletResponse response) throws IOException {
        String fileName = "导入模板";
        String sheetName = "导入模板";
        try {
            DownloadTemplate.writeExcel(response, null, fileName, sheetName, PersonnelVo.class);
        } catch (IOException e) {
            // 重置response
            response.reset();
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            Map<String, String> map = new HashMap<>();
            map.put("status", "failure");
            map.put("message", "下载文件失败" + e.getMessage());
            response.getWriter().println(JSON.toJSONString(map));
        }
    }

    /**
     * 修改人员信息
     *
     * @param personnel 人员信息实体类
     * @return ReturnData
     */
    @RequestMapping("/updatePersonnel")
    @ResponseBody
    public ReturnData updatePersonnel(@RequestBody Personnel personnel) {
        return personnelService.updatePersonnel(personnel);
    }

    /**
     * 批量修改人员部门
     * @param primaryPositionId 原部门id
     * @param targetPositionId  目标部门id
     * @return 修改信息
     */
    @RequestMapping("/exitBatchPosition")
    @ResponseBody
    public ReturnData exitBatchPosition(Integer primaryPositionId,Integer targetPositionId){
        if (StringUtils.isNotNull(primaryPositionId) && StringUtils.isNotNull(targetPositionId)){
            int i = personnelService.exitBatchPosition(primaryPositionId,targetPositionId,DateUtil.getSession());
            if (StringUtils.isNotNull(i)){
                return ReturnData.ok();
            }
        }
        return ReturnData.error(ReturnConstant.FAIL,"请输入正确的部门信息");
    }


    /**
     * 删除人员信息
     *
     * @param personnelId 人员id
     * @return ReturnData
     */
    @PostMapping("/deletePersonnel")
    @ResponseBody
    public ReturnData deletePersonnel(int personnelId) {
        return personnelService.deletePersonnel(personnelId);
    }
}
